#include <iostream>
#include <unistd.h>
#include <string>
#include <sys/types.h>
#include <signal.h>
#include <cstring>
#include <cerrno>

using namespace std;

// 调用系统调用产生信号

// kill()系统调用产生信号
// 命令行调用top命令,获取top进程的pid
// mykill -9 pid
/* int main(int argc,char* argv[])
{
    if(argc!=3)
    {
        cout<<"Usage: "<<argv[0]<<" -signumber pid"<<endl;
    }
    int signumber=stoi(argv[1]+1);
    int pid=stoi(argv[2]);
    int n=kill(pid,signumber);
    if(n<0)
    {
        cout<<"kill failed:"<<strerror(errno)<<endl;
    }
    return 0;
}*/

//raise()系统调用
/* int main()
{
    int cnt=0;
    while(true)
    {
        cout<<"cnt: "<<cnt++<<endl;
        sleep(1);
        if(cnt==5)
        {
            cout<<"send singnumber:9  to caller"<<endl;
            raise(9);
        }
    }
    return 0;
} */

//abort()
/* void handler(int signumber)
{
    cout<<"get a signal,number id: "<<signumber<<endl;
}
int main()
{
   signal(SIGABRT,handler);
   int cnt=0;
   while(true)
   {
     cout<<"cnt: "<<cnt++<<endl;
     if(cnt==8)
     {
        abort();
     }
   }
   return 0;
} */

/* void handler(int signumber)
{
    cout<<"get a signal,sigid:"<<signumber<<endl;
    exit(0);
}
int main()
{
    signal(SIGALRM,handler);
    alarm(1);//设定一个闹钟,谁调用alarm()函数给谁设定闹钟;
    int cnt=0;
    while(true)
    {
        cout<<"cnt: "<<cnt++<<endl;
    }
    return 0;
}
 */

/* int g_cnt=0;
void handler(int signumber)
{
    cout<<"get a sig:"<<signumber<<" g_cnt:"<<g_cnt<<endl;
    exit(0);
}
int main()
{
    signal(SIGALRM,handler);
    alarm(1);
    while(true)
    {
        g_cnt++;
    }
    return 0;
} */

//alarm()函数返回值,当alarm()函数向进程发送了SIGALRM信号,返回值为0
//重复设定闹钟时,出现上一次闹钟没有响,则本次闹钟alarm()函数的返回值为上一次闹钟剩余的秒数

//证明闹钟一旦设定,一旦向进程发送SIGALRM信号,此后再也不会发送SIGALRM信号(闹钟只响一次)
/* void handler(int signumber)
{
    cout<<"get a sig: "<<signumber<<endl;
}
int main()
{
    signal(SIGALRM,handler);

    alarm(5);//

    int cnt=0;
    while(true)
    {
        sleep(1);
        cout<<"cnt: "<<cnt++<<endl;
    }
} */

//设置alarm()函数多次发送SIGALRM信号的方法(闹钟每隔一定的时间间隔进行响动):信号捕捉函数handler()方法中再次设定闹钟
/* void handler(int signumber)
{
    cout<<"get a sig: "<<signumber<<endl;
    alarm(2);
}
int main()
{
    signal(SIGALRM,handler);

    alarm(5);

    int cnt=0;
    while(true)
    {
        sleep(1);
        cout<<"cnt: "<<cnt++<<endl;
    }
}*/

//alarm()函数返回值(命令行给当前进程提前发送闹钟信号,该进程的中alarm(50)并没有被执行,由于提前发送信号会导致捕捉函数自动被调用)
//重新设定第二次闹钟alarm(5),但是第一次闹钟alarm(50)还没有响,此时alarm(5)的返回值便是alarm(50)剩余的秒数
/* void handler(int signumber)
{
    cout<<"get a sig: "<<signumber<<endl;
    unsigned int n=alarm(5);
    cout<<"还剩多少时间: "<<n<<endl;
}
int main()
{
    signal(SIGALRM,handler);

    alarm(50);

    int cnt=0;
    while(true)
    {
        sleep(1);
        cout<<"cnt: "<< cnt++ <<",pid is: "<<getpid()<<endl;
    }
} */

//alarm(0):取消闹钟
/* int main()
{
    alarm(5);

    int cnt=0;
    while(true)
    {
        sleep(1);
        cout<<"cnt: "<<cnt++<<",pid: "<<getpid()<<endl;
        if(cnt==2)
        {
            int n=alarm(0);
            cout<<"alarm(0) ret: "<<n<<endl;
        }
    }
    return 0;
} */

//除0错误
/* void handler(int signal)
{
    cout<<"get a sig: "<<signal<<endl;
    sleep(1);
}
int main()
{

    signal(SIGFPE,handler);
    int a=10;
    a/=0;
    while(1)
    {
        sleep(1);
    }
    return 0;
} */

//野指针
void handler(int signal)
{
    cout<<"get a signal:"<<signal<<endl;
}
int main()
{
    //signal(SIGSEGV,handler);
    int* p=nullptr;
    *p=100;
    while(1)
    {
        sleep(1);
    }
    return 0;
}